#pragma once

#include "luster_config.hh"
#include "luster_int.hh"

#if luster_CFG(DEBUGBREAK)
#define debug_break() __asm__("int3")
#else
#define debug_break()
#endif

/* 从 M_start 到 M_end，不包括 M_end 的循环语句头部。使用 UInt 类型的迭代变量 it
迭代这个范围。

示例：

	// 计算从 0 到 99 的和。
	UInt sum = 0;
	for_range(0, 100) {
		sum += it;
	}

这个宏保证了 M_end 只被求值了一次。
*/
#define for_range(M_start, M_end) for_range_it(it, M_start, M_end)

/* 相比 for_range 宏，这个宏可以自己决定迭代变量的名字，而不是默认为 it。

而且 M_end 求值的结果保存到 {M_it}__end 里，可以自由取用。

下面的示例将 a 数组中的值打印为 [2, 3, 5, 7, 11] 这样的形式：

	int a[] = {2, 3, 5, 7, 11};

	printf("[");
	for_range_it(i, 0, 5) {
		if (i + 1 != i__end) {
			printf(", ");
		}
		printf("%s", a[i]);
	}
	printf("]");
*/
#define for_range_it(M_it, M_start, M_end) \
	for (UInt M_it = (M_start), M_it##__end = (M_end); M_it < M_it##__end; \
		++M_it)
